package mysql

import (
	"fmt"
	"log"
	"os"
	"time"

	"douyin/models"
	"douyin/setup/settings"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var db *gorm.DB

func Init(cfg *settings.MySQLConfig) (err error) {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		cfg.User,
		cfg.Password,
		cfg.Host,
		cfg.Port,
		cfg.DbName,
	)
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer（日志输出的目标，前缀和日志包含的内容——译者注）
		logger.Config{
			SlowThreshold: time.Second, // 慢 SQL 阈值
			LogLevel:      logger.Info, // 日志级别
			Colorful:      false,       // 禁用彩色打印
		},
	)
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		PrepareStmt:            true,      //预编译
		SkipDefaultTransaction: true,      //跳过事务
		Logger:                 newLogger, //日志格式
	},
	)
	sqlDB, _ := db.DB()

	//设置数据库连接池参数
	sqlDB.SetMaxOpenConns(cfg.MaxOpenConns) //设置数据库连接池最大连接数
	sqlDB.SetMaxIdleConns(cfg.MaxIdleConns) //连接池最大允许的空闲连接数，如果没有sql任务需要执行的连接数大于20，超过的连接会被连接池关闭。

	//数据迁移，创建表
	if !db.Migrator().HasTable(&models.User{}) {
		err = db.AutoMigrate(&models.User{})
	}
	if !db.Migrator().HasTable(&models.Com{}) {
		err = db.AutoMigrate(&models.Com{})
	}
	if !db.Migrator().HasTable(&models.Vid{}) {
		err = db.AutoMigrate(&models.Vid{})
	}
	if !db.Migrator().HasTable(&models.Relation{}) {
		err = db.AutoMigrate(&models.Relation{})
	}
	if !db.Migrator().HasTable(&models.Commentator{}) {
		err = db.AutoMigrate(&models.Commentator{})
	}
	if !db.Migrator().HasTable(&models.Favorite{}) {
		err = db.AutoMigrate(&models.Favorite{})
	}
	if !db.Migrator().HasTable(&models.Publisher{}) {
		err = db.AutoMigrate(&models.Publisher{})
	}
	return
}
